package com.airbat.prize.modules.base.service.structure;

import com.airbat.prize.common.pojo.PageResult;
import com.airbat.prize.modules.base.controller.structure.vo.*;
import com.airbat.prize.modules.base.dal.dataobject.structure.BaseStructureDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 组织架构 Service 接口
 *
 * @author 芋艿
 */
public interface BaseStructureService {

    /**
     * 初始化组织架构的本地缓存
     */
    void initLocalCache();

    /**
     * 创建组织架构
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    String createStructure(@Valid BaseStructureCreateReqVO createReqVO);

    /**
     * 更新组织架构
     *
     * @param updateReqVO 更新信息
     */
    void updateStructure(@Valid BaseStructureUpdateReqVO updateReqVO);

    /**
     * 删除组织架构
     *
     * @param id 编号
     */
    void deleteStructure(String id);

    /**
     * 获得组织架构
     *
     * @param id 编号
     * @return 组织架构
     */
    BaseStructureDO getStructure(String id);

    /**
     * 获得组织架构列表
     *
     * @param ids 编号
     * @return 组织架构列表
     */
    List<BaseStructureDO> getStructureList(Collection<String> ids);

    /**
     * 获得组织架构分页
     *
     * @param pageReqVO 分页查询
     * @return 组织架构分页
     */
    PageResult<BaseStructureDO> getStructurePage(BaseStructurePageReqVO pageReqVO);

    /**
     * 获得组织架构列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 组织架构列表
     */
    List<BaseStructureDO> getStructureList(BaseStructureExportReqVO exportReqVO);

    /**
     * 获得所有子架构，从缓存中
     *
     * @param parentId 架构编号
     * @param recursive 是否递归获取所有
     * @return 子架构列表
     */
    List<BaseStructureDO> getStructuresByParentIdFromCache(String parentId, boolean recursive);
}
